package com.odontosis.entidade;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.validator.NotNull;

import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.PagamentoService;

@Entity
@Table(name = "recibo")
public class Recibo extends OdontosisBusinessObject {
	private static final long serialVersionUID = 8511770493160446221L;
	
	@NotNull
	@ManyToOne
	@JoinColumn(name = "pagamento")
	private Pagamento pagamento;
	
	@NotNull
	@Column(name = "valor")
	private BigDecimal valor;
	
	@NotNull
	@Column(name = "data_recibo")
	@Temporal(TemporalType.TIMESTAMP)
	private Date data;
	
	@Column(name = "versao_recibo")
	private Integer versao;
	
	@OneToOne
	@JoinColumn(name = "recibo_pai")
	private Recibo reciboAnulado;
			
	@Column(name = "valido")
	private boolean valido;
	
	
	@Column(name = "tiporecibo")
	@Enumerated(EnumType.STRING)
	private TipoRecibo tipoRecibo;
	
	@Column(name = "formapagamento")
	@Enumerated(EnumType.STRING)
	private FormaPagamento formaPagamento;
	
	@Column(name = "numerocheque")
	private String numeroCheque;
	
	@Column(name = "emitente")
	private String nomeEmitente;
	
	@Column(name = "banco")
	private String banco;
	
	@ManyToOne
	@JoinColumn(name = "usuario")
	private Usuario usuario;
	
	@ManyToOne
	@JoinColumn(name = "usuario_cancelamento")
	private Usuario usuarioCancelamento;
	
	@Column(name = "data_cancelamento")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataCancelamento;
	
	@JoinColumn(name = "justificativa_cancelamento")
	private String justificativaCancelamento;
	
	@OneToMany
	@JoinColumn(name = "recibo")
	private List<ReciboDetalhe> listaReciboDetalhe;
	
	@Column(name = "comentario")
	private String comentario;

	public String getComentario() {
		return comentario;
	}

	public void setComentario(String comentario) {
		this.comentario = comentario;
	}

	public Date getDataCancelamento() {
		return dataCancelamento;
	}

	public void setDataCancelamento(Date dataCancelamento) {
		this.dataCancelamento = dataCancelamento;
	}

	public Recibo getReciboAnulado() {
		return reciboAnulado;
	}

	public void setReciboAnulado(Recibo reciboAnulado) {
		this.reciboAnulado = reciboAnulado;
	}

	public Pagamento getPagamento() {
		return pagamento;
	}

	public void setPagamento(Pagamento pagamento) {
		this.pagamento = pagamento;
	}

	public BigDecimal getValor() {
		return valor;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public Integer getVersao() {
		return versao;
	}

	public void setVersao(Integer versao) {
		this.versao = versao;
	}

	public boolean isValido() {
		return valido;
	}

	public void setValido(boolean valido) {
		this.valido = valido;
	}

	public TipoRecibo getTipoRecibo() {
		return tipoRecibo;
	}

	public void setTipoRecibo(TipoRecibo tipoRecibo) {
		this.tipoRecibo = tipoRecibo;
	}

	public FormaPagamento getFormaPagamento() {
		return formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	public String getNumeroCheque() {
		return numeroCheque;
	}

	public void setNumeroCheque(String numeroCheque) {
		this.numeroCheque = numeroCheque;
	}

	public String getNomeEmitente() {
		return nomeEmitente;
	}

	public String getBanco() {
		return banco;
	}

	public void setNomeEmitente(String nomeEmitente) {
		this.nomeEmitente = nomeEmitente;
	}

	public void setBanco(String banco) {
		this.banco = banco;
	}
	
	@Transient
	public String getNumeroParcela(){
		pagamento = getPagamento();
		Integer mes = pagamento.getServico().getMesVencimentoPrimeiraParcela() - 1;
		Integer mesParcela = pagamento.getMesVencimento();
		Integer diferenca = mesParcela - mes;
		if(diferenca < 0){
			diferenca += 12;
		}
		return diferenca.toString(); 
	}
	
	@Transient
	public String getTotalParcelas() {
		try {
			PagamentoService pagamentoService = ContainerIoc.getPagamentoService();
			return  pagamentoService.numeroParcelas(getPagamento()).toString();
		} catch (Exception e) {
		}
		return "0";
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuarioCancelamento() {
		return usuarioCancelamento;
	}

	public void setUsuarioCancelamento(Usuario usuarioCancelamento) {
		this.usuarioCancelamento = usuarioCancelamento;
	}

	public List<ReciboDetalhe> getListaReciboDetalhe() {
		return listaReciboDetalhe;
	}

	public void setListaReciboDetalhe(List<ReciboDetalhe> listaReciboDetalhe) {
		this.listaReciboDetalhe = listaReciboDetalhe;
	}

	public String getJustificativaCancelamento() {
		return justificativaCancelamento;
	}

	public void setJustificativaCancelamento(String justificativaCancelamento) {
		this.justificativaCancelamento = justificativaCancelamento;
	}
	
}
